﻿package net.wangit.jdbc;

import java.util.ArrayList;
import java.util.List;

import net.wangit.jdbc.executable.DeleteRow;
import net.wangit.jdbc.executable.InsertRow;
import net.wangit.jdbc.executable.UpdateRow;
import net.wangit.util.Checker;


/**
 * 表对象，依据表组件的配置用来执行数据库操作。
 * Table中包含了行(ColumnRow)数据，每一个ColumnRow对象对应了1条新增、修改或删除的数据。 包含多行时会按照次序执行，
 * 如果数据库支持批处理，多条操作将使用批处理方式执行。
 * 
 * @author watson Feb 12, 2010
 */
public class Table {

	private String domain;
	private String tableName;
	private String unitId;
	private List<ColumnRow> rows;

	public Table(String domain, String tableName) {
		rows = new ArrayList<ColumnRow>();
		this.tableName = tableName;
		this.domain = domain;
	}

	// 创建一个删除行并加入Table，需要通过ColumnRow.putPrimaryKey()设置主键字段的值。
	public ColumnRow addDeleteRow() {
		ColumnRow row = new DeleteRow();
		rows.add(row);
		return row;
	}

	// 创建一个新增行并加入Table，需要通过ColumnRow.putColumn()设置字段的值。
	public ColumnRow addInsertRow() {
		ColumnRow row = new InsertRow();
		rows.add(row);
		return row;
	}

	// 创建一个修改行并加入Table，需要通过ColumnRow.putColumn()设置字段的值（包括主键字段），
	// 并且通过ColumnRow.putPrimaryKey()设置主键字段的值（修改之前的值）。 
	public ColumnRow addUpdateRow() {
		ColumnRow row = new UpdateRow();
		rows.add(row);
		return row;
	}

	// 取得域，未设置时使用"app"域。
	public String getDomain() {
		return Checker.isEmpty(domain) ? "app" : domain;
	}

	// 取得所有行。
	public List<ColumnRow> getRows() {
		return rows;
	}

	// 取得表名。
	public String getTableName() {
		return tableName;
	}

	// 取得单元编号。
	public String getUnitId() {
		return unitId;
	}

	// 设置单元编号，手动创建的Table不必设置。
	public void setUnitId(String unitId) {
		this.unitId = unitId;
	}
}
